package com.yang.service.impl;

import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.yang.common.PageQuery;
import com.yang.entity.dto.ConsultationRecordDTO;
import com.yang.entity.dto.PatientDTO;
import com.yang.entity.dto.ConsultationRecordDetailDTO;
import com.yang.entity.vo.ConsultationRecordVO;
import com.yang.entity.vo.ConsultationRecordDetailVO;
import com.yang.mapper.ConsultationRecordMapper;
import com.yang.mapper.PatientMapper;
import com.yang.service.ConsultationRecordService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

@Service
@Slf4j
public class ConsultationRecordServiceImpl implements ConsultationRecordService {

    @Autowired
    private ConsultationRecordMapper consultationRecordMapper;

    @Autowired
    private PatientMapper patientMapper;

    /**
     * 分页查询病人就诊记录
     * @param pageQuery
     * @return
     */
    @Override
    public PageInfo<ConsultationRecordVO> pageQuery(PageQuery<ConsultationRecordDTO> pageQuery) {
        ConsultationRecordDTO params = pageQuery.getParams();
        PageHelper.startPage(pageQuery.getPageNum(), pageQuery.getPageSize());
        List<ConsultationRecordVO> result = consultationRecordMapper.getConsultationRecordList(params);
        if (CollectionUtils.isNotEmpty(result)) {
            return new PageInfo<>(result);
        }
        return new PageInfo<>(Collections.emptyList());
    }

    /**
     * 新增病人就诊记录
     * @param consultationRecordDTO
     * @return
     */
    @Override
    @Transactional
    public int add(ConsultationRecordDTO consultationRecordDTO) {
        String id = UUID.randomUUID().toString().replace("-", "");
        consultationRecordDTO.setId(id);
        // 1.新增病人就诊信息
        int insert = consultationRecordMapper.insert(consultationRecordDTO);
        if (insert == 1) {
            log.info("新增病人就诊记录成功");
        } else {
            log.error("新增病人就诊记录失败");
        }

        List<ConsultationRecordDetailDTO> consultationRecordDetailList = consultationRecordDTO.getConsultationRecordDetailList();
        if (CollectionUtils.isNotEmpty(consultationRecordDetailList)) {
            for (ConsultationRecordDetailDTO regionDetailDTO : consultationRecordDetailList) {
                regionDetailDTO.setId(UUID.randomUUID().toString().replace("-", ""));
                regionDetailDTO.setConsultationId(id);
            }

            // 2.新增病人就诊记录详情信息
            int insert2 = consultationRecordMapper.batchInsertDetail(consultationRecordDTO.getConsultationRecordDetailList());
            if (insert2 == consultationRecordDetailList.size()) {
                log.info("新增病人就诊记录详情成功: {}", insert2);
            } else {
                log.error("新增病人就诊记录详情失败");
            }
        }

        // 3.更新病人的剩余次数
        PatientDTO patientDTO = new PatientDTO();
        patientDTO.setId(consultationRecordDTO.getPatientId());
        patientDTO.setUseNumber(consultationRecordDTO.getNumber());
        int update = patientMapper.update(patientDTO);
        if (update == 1) {
            log.info("更新病人剩余次数成功");
        } else {
            log.error("更新病人剩余次数失败");
        }
        return insert;
    }

    /**
     * 更新病人就诊记录
     * @param consultationRecordDTO
     * @return
     */
    @Override
    @Transactional
    public int update(ConsultationRecordDTO consultationRecordDTO) {
        // 获取就诊记录id
        String consultationId = consultationRecordDTO.getId();
        // 1.更新病人就诊记录详情
        List<ConsultationRecordDetailDTO> consultationRecordDetailList = consultationRecordDTO.getConsultationRecordDetailList();
        if (CollectionUtils.isNotEmpty(consultationRecordDetailList)) {
            // 根据就诊记录详情有无主键来判断是更新还是新增
            List<ConsultationRecordDetailDTO> updateList = consultationRecordDetailList.stream().filter(item -> StringUtils.isNotEmpty(item.getId())).collect(Collectors.toList());
            List<ConsultationRecordDetailDTO> insertList = consultationRecordDetailList.stream().filter(item -> StringUtils.isEmpty(item.getId())).collect(Collectors.toList());
            if (CollectionUtils.isNotEmpty(updateList)) {
                // 批量更新就诊记录详情
                int update2 = consultationRecordMapper.batchUpdateDetail(updateList);
                log.info("更新数量: {}", update2);
                if (update2 == updateList.size()) {
                    log.info("更新病人就诊记录详情成功");
                }
            }
            if (CollectionUtils.isNotEmpty(insertList)) {
                insertList.forEach(item -> {
                    item.setId(UUID.randomUUID().toString().replace("-", ""));
                    item.setConsultationId(consultationId);
                });
                // 执行新增就诊记录详情
                int update2 = consultationRecordMapper.batchInsertDetail(insertList);
                log.info("新增数量: {}", update2);
                if (update2 == updateList.size()) {
                    log.info("新增病人就诊记录详情成功");
                }
            }
        }

        // 2.更新病人剩余次数
        // 2.1先查询本次就诊记录原来使用的次数
        ConsultationRecordVO consultationRecord = consultationRecordMapper.getConsultationRecordById(consultationId);
        // 2.2计算多用了几次（本次更新的次数 - 原来就诊的次数）
        int difference = consultationRecordDTO.getNumber() - consultationRecord.getNumber();
        // 2.3病人的剩余次数 - 多用的次数
        PatientDTO patientDTO = new PatientDTO();
        patientDTO.setId(consultationRecordDTO.getPatientId());
        patientDTO.setUseNumber(difference);
        int update3 = patientMapper.update(patientDTO);
        if (update3 == 1) {
            log.info("更新病人剩余次数成功");
        }

        // 3.更新病人就诊记录（本次使用总次数）
        int update = consultationRecordMapper.update(consultationRecordDTO);
        if (update == 1) {
            log.info("更新病人就诊记录成功");
        } else {
            log.info("更新病人就诊记录失败");
        }

        return update;
    }

    /**
     * 查询病人就诊记录详情
     * @param consultationId 就诊记录id
     * @return
     */
    @Override
    public List<ConsultationRecordDetailVO> getConsultationRecordDetail(String consultationId) {
        List<ConsultationRecordDetailVO> result = consultationRecordMapper.getConsultationRecordDetail(consultationId);
        if (CollectionUtils.isNotEmpty(result)) {
            return result;
        }
        return Collections.emptyList();
    }

}
